//: io/SerialCtl.java
// Controlling serialization by adding your own
// writeObject() and readObject() methods.
package io;

import java.io.*;

public class SerialCtl implements Serializable
{
    private String a;
    
    private transient String b;
    
    public SerialCtl(String aa, String bb)
    {
        a = "Not Transient: " + aa;
        b = "Transient: " + bb;
    }
    
    public String toString()
    {
        return a + "\n" + b;
    }
    
    private void writeObject(ObjectOutputStream stream)
        throws IOException
    {
        stream.defaultWriteObject();
        stream.writeObject(b);
    }
    
    private void readObject(ObjectInputStream stream)
        throws IOException, ClassNotFoundException
    {
        stream.defaultReadObject();
        b = (String)stream.readObject();
    }
    
    public static void main(String[] args)
        throws IOException, ClassNotFoundException
    {
        SerialCtl sc = new SerialCtl("Test1", "Test2");
        System.out.println("Before:\n" + sc);
        ByteArrayOutputStream buf = new ByteArrayOutputStream();
        ObjectOutputStream o = new ObjectOutputStream(buf);
        o.writeObject(sc);
        // Now get it back:
        ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(buf.toByteArray()));
        SerialCtl sc2 = (SerialCtl)in.readObject();
        System.out.println("After:\n" + sc2);
    }
} /*
   * Output: Before: Not Transient: Test1 Transient: Test2 After: Not Transient: Test1 Transient: Test2
   */// :~
